﻿// Copyright 2009 Mike Geise
// 
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// 
//     http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

namespace Falcon.Core.Extensions
{
	using System;
	using System.IO;

	public static class StreamExtension
	{
		public static byte[] ReadFully(this Stream stream)
		{
			return ReadFully(stream, 0);
		}

		public static byte[] ReadFully(this Stream stream, int length)
		{
			if (length < 1)
			{
				length = 32768;
			}

			var buffer = new byte[length];
			var read = 0;
			int chunk;

			while ((chunk = stream.Read(buffer, read, buffer.Length - read)) > 0)
			{
				read += chunk;

				if (read != buffer.Length)
				{
					continue;
				}

				var next = stream.ReadByte();

				if (next == -1)
				{
					return buffer;
				}

				var newBuffer = new byte[buffer.Length * 2];

				Array.Copy(buffer, newBuffer, buffer.Length);

				newBuffer[read] = (byte)next;

				buffer = newBuffer;

				read++;
			}

			var retained = new byte[read];

			Array.Copy(buffer, retained, read);

			return retained;
		}
	}
}